package com.atguigu.aop.proxy;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
@Aspect
@Order(value = 5)
public class AtguiguAroundAspect {

    @Around(value = "com.atguigu.aop.proxy.AtguiguPointCut.myPointCut()")
    public Object myAroundOperation(ProceedingJoinPoint joinPoint) throws Throwable {

        // 1、目标方法的相关信息
        Signature signature = joinPoint.getSignature();
        String methodName = signature.getName();
        Object[] args = joinPoint.getArgs();
        List<Object> argList = ((args == null || args.length == 0) ? null : Arrays.asList(args));
        Object targetReturn = null;

        try {
            System.out.println("[环绕通知]["+methodName+"方法开始了][参数列表："+argList+"]");

            // 2、通过 ProceedingJoinPoint 对象调用目标方法
            // 注意两个方面：
            // 外界调用目标方法时传入的参数，需要通过 proceed() 方法传递给目标方法
            // 目标方法返回值，需要通过 proceed() 方法返回给外界调用者
            targetReturn = joinPoint.proceed(args);

            System.out.println("[环绕通知]["+methodName+"方法成功了][返回值："+targetReturn+"]");

        } catch (Throwable e) {
            System.out.println("[环绕通知]["+methodName+"方法失败了][异常信息："+e.getMessage()+"]");
            throw new RuntimeException(e);
        } finally {
            System.out.println("[环绕通知]["+methodName+"方法结束了]");
        }

        return targetReturn;
    }

}
